//495. 提莫攻击
/*在《英雄联盟》的世界中，有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希（编者注：寒冰射手）进入中毒状态。

当提莫攻击艾希，艾希的中毒状态正好持续 duration 秒。

正式地讲，提莫在 t 发起攻击意味着艾希在时间区间 [t, t + duration - 1]（含 t 和 t + duration - 1）处于中毒状态。如果提莫在中毒影响结束 前 再次攻击，中毒状态计时器将会 重置 ，在新的攻击之后，中毒影响将会在 duration 秒后结束。

给你一个 非递减 的整数数组 timeSeries ，其中 timeSeries[i] 表示提莫在 timeSeries[i] 秒时对艾希发起攻击，以及一个表示中毒持续时间的整数 duration 。

返回艾希处于中毒状态的 总 秒数。

 */
 class Solution {
public:
    int findPoisonedDuration(vector<int>& timeSeries, int d) {
        int ret = d;
        for (int i = 1; i < timeSeries.size(); i++) {
            int x = timeSeries[i] - timeSeries[i - 1];
            if (x >= d)
                ret += d;
            else
                ret += x;
        }
        return ret;
    }
};

// Z 字形变换
/*将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：

P   A   H   N
A P L S I I G
Y   I   R
之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。

请你实现这个将字符串进行指定行数变换的函数：

string convert(string s, int numRows);*/
class Solution {
public:
    void cyc_z(string& ret, string& s, int n, int d, int index) {
        while (index < n) {
            ret += s[index];
            index += d;
        }
    }
    void cyc_z_two(string& ret, string& s, int n, int d, int index,
                   int _index) {
        while (index < n || _index < n) {
            if (index < n) {
                ret += s[index];
                index += d;
            }
            if (_index < n) {
                ret += s[_index];
                _index += d;
            }
        }
    }
    string convert(string s, int nR) {

        string ret;
        int n = s.size();
        int d = 2 * nR - 2;
        if (nR == 1)
            return s;
        for (int i = 0; i < nR; i++) {
            if (i == 0 || i == nR - 1) {
                cyc_z(ret, s, n, d, i);
            } else {
                // cyc_z(s, n, d, i);
                // cyc_z(s, n, d, d - i);
                cyc_z_two(ret, s, n, d, i, d - i);
            }
        }
        return ret;
    }
};